package borrador.grafica;

import java.awt.Point;
import java.util.Iterator;

import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import borrador.VehiculoHerenciaMultiple;

import controlador.ControladorEditor;
import controlador.NoExisteEntidadGraficable;

import vista.objetos.AtributoGraficable;
import vista.objetos.AtributoTipoNoSoportadoException;
import vista.objetos.DiagramaGraficable;
import vista.objetos.EntidadGraficable;
import vista.objetos.EntidadTipoNoSoportadoException;
import vista.objetos.GraficableException;
import vista.objetos.JerarquiaGraficable;
import vista.objetos.ProyectoGraficable;
import vista.objetos.RelacionTipoNoSoportadoException;

import logica.*;

/* esto es para probar la forma de graficar herencia con más de un tipo de
 * clasificacion*/

public class VehiculoHerenciaMultipleGraficable
{
	public ProyectoGraficable proyectoGraficable;

	public VehiculoHerenciaMultipleGraficable() throws AtributoRepetidoException, AtributoSimpleException, SinNombreException, IdExternoRepetidoException, AtributoIdentificadorFaltanteException, EntidadIdentificadoraFaltanteException, IdentificadorVacioException, AtributoTipoNoSoportadoException, EntidadTipoNoSoportadoException, NoExisteEntidadGraficable, JerarquiaException, EntidadRepetidaException, IdExternoInexistenteException, GraficableException
	{
		VehiculoHerenciaMultiple vehiculoH = new VehiculoHerenciaMultiple();
		
		/*creo el proyecto logico inicialmnt vacio por lo que tengo que crear un diagrama ppal*/
		Proyecto proyectoLogico = vehiculoH.getProyecto();
		
		/*creo un proyecto graficable. Hay que convertir todos los diagramas logicos que tenga
		 * a diagramas graficables, en este caso solo es uno solo porq está vacío el proyecto */
		DiagramaGraficable diagramaGraficable = new DiagramaGraficable(proyectoLogico.getDiagramaPpal());
		proyectoGraficable = new ProyectoGraficable(proyectoLogico, diagramaGraficable  );

		/*a partir de ahora agrego los objetos graficables al diagrama graficable*/
		
		/*para las entidades es necesario setear por fuera la lista de atributos graficables*/
		EntidadGraficable entidadVehiculo = crearEntidadGraficableVehiculo(vehiculoH);
		EntidadGraficable entidadAuto = crearEntidadGraficableAuto(vehiculoH);
		EntidadGraficable entidadCamion = crearEntidadGraficableCamion(vehiculoH);
		EntidadGraficable entidadCuatriciclo = crearEntidadGraficableCuatriciclo(vehiculoH);
		EntidadGraficable entidadTriciclo = crearEntidadGraficableTriciclo(vehiculoH);
		
		/*agrego las entidades al diagrama actual*/
		proyectoGraficable.getDiagramaActual().agregarGraficable(entidadVehiculo);
		proyectoGraficable.getDiagramaActual().agregarGraficable(entidadAuto);
		proyectoGraficable.getDiagramaActual().agregarGraficable(entidadCamion);
		proyectoGraficable.getDiagramaActual().agregarGraficable(entidadCuatriciclo);
		proyectoGraficable.getDiagramaActual().agregarGraficable(entidadTriciclo);	

		/*agrego creo las jerarquias graficables */
		JerarquiaGraficable tipo = crearJerarquiaGraficableTipo(vehiculoH);
		JerarquiaGraficable cantRuedas = crearJerarquiaGraficableCantRuedas(vehiculoH);

		
		/*agrego las jerarquias al gráfico*/
		proyectoGraficable.getDiagramaActual().agregarGraficable(tipo);
		proyectoGraficable.getDiagramaActual().agregarGraficable(cantRuedas);

		
		ControladorEditor controlador = ControladorEditor.getInstancia();
		controlador.abrirVentanaEditor(proyectoGraficable);
		controlador.getVentanaPrograma().getHojaDeDibujo().cambiarSentidoDeHoja();
	}

	private JerarquiaGraficable crearJerarquiaGraficableCantRuedas(VehiculoHerenciaMultiple vehiculoH) throws NoExisteEntidadGraficable{
		JerarquiaGraficable cantRuedas;
		cantRuedas = new JerarquiaGraficable(vehiculoH.getJerarquiaCantRuedas());
		cantRuedas.getPunto().setLocation(new Point(500, 150));	
		cantRuedas.setEntidadesEspecializadas(TransformadorAGraficable.getListaEntidadGraficable(vehiculoH.getJerarquiaCantRuedas().getEntidadesEspecializadas(), this.proyectoGraficable.getDiagramaActual()));
		cantRuedas.setEntidadPadre(TransformadorAGraficable.getEntidadGraficableExistente(vehiculoH.getJerarquiaCantRuedas().getEntidadPadre(), this.proyectoGraficable.getDiagramaActual()));
		return cantRuedas;
	}

	private JerarquiaGraficable crearJerarquiaGraficableTipo(VehiculoHerenciaMultiple vehiculoH) throws NoExisteEntidadGraficable {
		JerarquiaGraficable tipo;
		tipo = new JerarquiaGraficable(vehiculoH.getJerarquiaTipo());
		tipo.getPunto().setLocation(new Point(250, 150));	
		tipo.setEntidadesEspecializadas(TransformadorAGraficable.getListaEntidadGraficable(vehiculoH.getJerarquiaTipo().getEntidadesEspecializadas(), this.proyectoGraficable.getDiagramaActual()));
		tipo.setEntidadPadre(TransformadorAGraficable.getEntidadGraficableExistente(vehiculoH.getJerarquiaTipo().getEntidadPadre(), this.proyectoGraficable.getDiagramaActual()));
		return tipo;
	}



	private EntidadGraficable crearEntidadGraficableTriciclo(VehiculoHerenciaMultiple vehiculoH)
	throws EntidadTipoNoSoportadoException, AtributoTipoNoSoportadoException 
	{
		EntidadGraficable entidadTriciclo;
		entidadTriciclo  = TransformadorAGraficable.getEntidadGraficable(vehiculoH.getTriciclo());
		entidadTriciclo.getPunto().setLocation(new Point(550, 200));
		//entidadCuatriciclo.setAtributos(TransformadorAGraficable.getAtributoGraficables(vehiculoH.getCuatriciclo().getAtributos()));
		//
		//Iterator<AtributoGraficable> itAtriGraf = entidadCuatriciclo.getAtributos().iterator();
		//int i = 0;
		//
		//while(itAtriGraf.hasNext())
		//{
		//	AtributoGraficable atributo = itAtriGraf.next();
		//	
		//	atributo.getPunto().setLocation(new Point(400 + i * 70, 370 + i*20));
		//	i++;
		//}
		
		return entidadTriciclo;
	}

	private EntidadGraficable crearEntidadGraficableCuatriciclo(VehiculoHerenciaMultiple vehiculoH)
			throws EntidadTipoNoSoportadoException,
			AtributoTipoNoSoportadoException {
		EntidadGraficable entidadCuatriciclo;
		entidadCuatriciclo  = TransformadorAGraficable.getEntidadGraficable(vehiculoH.getCuatriciclo());
		entidadCuatriciclo.getPunto().setLocation(new Point(450, 200));
//		entidadCuatriciclo.setAtributos(TransformadorAGraficable.getAtributoGraficables(vehiculoH.getCuatriciclo().getAtributos()));
//		
//		Iterator<AtributoGraficable> itAtriGraf = entidadCuatriciclo.getAtributos().iterator();
//		int i = 0;
//		
//		while(itAtriGraf.hasNext())
//		{
//			AtributoGraficable atributo = itAtriGraf.next();
//			
//			atributo.getPunto().setLocation(new Point(400 + i * 70, 370 + i*20));
//			i++;
//		}
		
		return entidadCuatriciclo;
	}

	private EntidadGraficable crearEntidadGraficableCamion(
			VehiculoHerenciaMultiple vehiculoH) throws EntidadTipoNoSoportadoException,
			AtributoTipoNoSoportadoException {
		EntidadGraficable entidadCamion;
		entidadCamion = TransformadorAGraficable.getEntidadGraficable(vehiculoH.getCamion());
		entidadCamion.getPunto().setLocation(new Point(300, 200));
//		entidadCamion.setAtributos(TransformadorAGraficable.getAtributoGraficables(vehiculoH.getObra().getAtributos()));
//		
//		Iterator<AtributoGraficable> itAtriGraf = entidadCamion.getAtributos().iterator();
//		int i = 0;
//		
//		while(itAtriGraf.hasNext())
//		{
//			AtributoGraficable atributo = itAtriGraf.next();
//			
//			atributo.getPunto().setLocation(new Point(400 + i * 50, 100 + i*20));
//			i++;
//		}
		return entidadCamion;
	}

	private EntidadGraficable crearEntidadGraficableAuto( VehiculoHerenciaMultiple vehiculoH) throws EntidadTipoNoSoportadoException, AtributoTipoNoSoportadoException 
	{
		EntidadGraficable entidadAuto;
		entidadAuto = TransformadorAGraficable.getEntidadGraficable(vehiculoH.getAuto());
		entidadAuto.getPunto().setLocation(new Point(200, 200));
//		entidadAuto.setAtributos(TransformadorAGraficable.getAtributoGraficables(vehiculoH.getLocalidad().getAtributos()));
//		
//		Iterator<AtributoGraficable> itAtriGraf = entidadAuto.getAtributos().iterator();
//		int i = 0;
//		
//		while(itAtriGraf.hasNext())
//		{
//			AtributoGraficable atributo = itAtriGraf.next();
//			
//			atributo.getPunto().setLocation(new Point(150 + i * 70, 370 + i*20));
//			i++;
//		}
		
		return entidadAuto;
	}

	private EntidadGraficable crearEntidadGraficableVehiculo(VehiculoHerenciaMultiple vehiculoH) throws EntidadTipoNoSoportadoException, AtributoTipoNoSoportadoException, GraficableException 
	{
		EntidadGraficable entidadVehiculo;
		entidadVehiculo = TransformadorAGraficable.getEntidadGraficable(vehiculoH.getVehiculo());
		entidadVehiculo.getPunto().setLocation(new Point(400, 50));
		entidadVehiculo.setAtributos(proyectoGraficable.getAtributoGraficables(((Entidad)entidadVehiculo.getObjetoDiagramaDecorado()).getAtributos()));
		
		int i = 0;
		Iterator<AtributoGraficable> itAtriGraf = entidadVehiculo.getAtributos().iterator();
		while(itAtriGraf.hasNext())
		{
			AtributoGraficable atributo = itAtriGraf.next();
			
			atributo.getPunto().setLocation(new Point(150 + i * 80, 100 + i*10));
			i++;
		}
		return entidadVehiculo;
	}
	
	public static void main(String[] args) throws AtributoRepetidoException, AtributoSimpleException, SinNombreException, IdExternoRepetidoException, AtributoIdentificadorFaltanteException, EntidadIdentificadoraFaltanteException, IdentificadorVacioException, AtributoTipoNoSoportadoException, EntidadTipoNoSoportadoException, RelacionTipoNoSoportadoException, NoExisteEntidadGraficable, ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException, JerarquiaException, EntidadRepetidaException, IdExternoInexistenteException, GraficableException
	{
		String l_f;
		l_f = "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel";

		UIManager.setLookAndFeel(l_f);
		
		new VehiculoHerenciaMultipleGraficable();
	}
	

}
	